#include "data.hpp"
#include <unistd.h>

extern Cloud_up::DataManager *_Dm;
namespace Cloud_up
{

    class HotManager
    {
    private:
        std::string _back_dir;  //不压缩存储路径
        std::string _pack_dir;   //压缩后存储路径
        std::string _arc_suffix;  //压缩后缀
        int _hot_time;   //热点时间

    private:
        bool HotJudge(const std::string &filename)
        {
            Filetool fn(filename);
            if (fn.Exists() == false)
            {
                std::cout << "文件不存在" << std::endl;
                return false;
            }
            // 计算是否为热点文件
            time_t last_atime = fn.LastATime();
            time_t sys_time = time(NULL);

            // 通过最后修改时间 和当前时间进行校验
            if(sys_time - last_atime > _hot_time)
            {
                return true;
            }
            return false;
        }
    public:
        HotManager()
        {
            //实例化配置文件，获取数据
            Config *cf = Config::GetInstance();
            _hot_time = cf->GetHotTime();
            _pack_dir = cf->GetPackDir();
            _back_dir=cf->GetBackDir();
            _arc_suffix = cf->GetArcSuffix();

            //没有的化需要创建，CreateDir内部有判断
            Filetool copy1(_back_dir);
            Filetool copy2(_pack_dir);
            copy1.CreateDir();
            copy2.CreateDir();
        }
        //服务器开跑
        bool RunModule()
        {
            // std::cout<<_pack_dir<<std::endl;
            while (1)
            {

                // 1.遍历目录 获取备份所有信息
                Filetool fu(_back_dir);
                std::vector<std::string> vs;
                fu.ScanDir(&vs); //



                // for(auto &a :vs)
                // {
                //     std::cout<<a<<std::endl;
                // }



                // 2.判断是否为热点文件
                for (auto &a : vs)
                {
                    
                    // 2.1 热点文件不处理(已经处理过)
                    if (HotJudge(a) == false)
                    {
                        continue;
                    }
                    // 3.获取缺少的备份信息,缺少就补上
                    BackupInfo bif;
                    // std::cout<<"报错前路径_pack:"<<bif._pack_path<<std::endl;
                    // std::cout<<"报错前路径_real:"<<bif._real_path<<std::endl;
                    // std::cout<<"报错前路径_url:"<<bif._url_path<<std::endl;
                    // std::cout<<"报错前路径_a:"<<a<<std::endl;

                    // std::cout<<"----------------------------------"<<std::endl;

                    // 不存在就直接改
                    if (_Dm->GetOneByRealPath(a, &bif) == false)
                    {
                        std::cout<<"更新信息"<<a<<std::endl;
                        bif.NewBackupInfo(a);
                    }


                    // 4.对非热点文件进行压缩
                    Filetool fh(a);
                    // std::cout<<"报错前路径_pack:"<<bif._pack_path<<std::endl;
                    // std::cout<<"报错前路径_real:"<<bif._real_path<<std::endl;
                    // std::cout<<"报错前路径_url:"<<bif._url_path<<std::endl;
                    // std::cout<<"报错前路径_a:"<<a<<std::endl;


                    fh.Compress(bif._pack_path); //压缩
                    // 4.1删除源文件
                    fh.ReMove();
                    // 4.2更新数据
                    bif._pack_flag = true;
                    _Dm->Update(bif);
                }
                usleep(1000); // 每隔1毫秒
            }
            return true;
        }
    };

}